package main

import "fmt"

//结构体嵌套有两种
//1.模拟继承性
//   type A struct{
//  	filed 字段
// 	}
//  type B struct{
// 		A // 匿名字段   且在B结构体中的对象能直接调用A结构体中的字段
//	}
//2.模拟聚合关系
//    type C struct{
//  	filed 字段
//  }
//    type D struct{
//  	c C //聚合关系
//  }
type address struct {
	province string
	city     string
}

type workplace struct {
	province string
	city     string
}
type person struct {
	name string
	age  int
	// addr address
	address //匿名嵌套结构体
	workplace
	company
}

type company struct {
	name string
	// addr address  //这种属于结构体嵌套中的模拟聚合关系
	address //这种属于结构体嵌套中的模拟继承性
	workplace
}

func main() {
	p1 := person{
		name: "John",
		age:  10,
		address: address{
			province: "陕西",
			city:     "宝鸡",
		},
		company: company{
			name: "迅锡",
		},
	}
	fmt.Println(p1.name, p1.age, p1.address.province, p1.address.city, p1.company.name)
	//  fmt.Println(p1.city)  //先在自己结构体中找这个结构体，找不到时就去匿名嵌套的结构体中查找该字段
	fmt.Println(p1.workplace.city) //多个匿名嵌套时，会造成字段冲突，需要指定嵌套结构体
}
